package editorsvg.editor.documento;

import editorsvg.editor.atributos.AtrLongitud;
import editorsvg.editor.atributos.AtrString;
import editorsvg.propiedades.GrupoPropiedades;
import editorsvg.propiedades.Propiedad;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;

/**
 * Documento que puede ser editado en el editor.
 * @author Jorge Berjano
 */
public class Documento extends ElementoEditable {

    private MapaSimbolos simbolos = new MapaSimbolos();    
    private static GrupoPropiedades propiedadesDocumento;
    private AtrLongitud ancho = new AtrLongitud();
    private AtrLongitud alto = new AtrLongitud();
    private AtrString xmlns = new AtrString();
    //private AtrCaja viewBox; 

    /** Constructor */
    public Documento() {
        ancho.setValor(500.0);
        alto.setValor(300.0);
        xmlns.setValor("http://www.w3.org/2000/svg");
    }

    @Override
    protected void asignarPropietariosPropiedades() {
        super.asignarPropietariosPropiedades();
        getPropiedadesDocumento().setPropietario(this);
    }

    @Override
    protected void poblarPropiedades() {
        super.poblarPropiedades();
        agregarPropiedades(getPropiedadesDocumento());
    }

    private GrupoPropiedades getPropiedadesDocumento() {
        if (propiedadesDocumento == null) {
            propiedadesDocumento = new GrupoPropiedades("Documento");
//        propiedadesDocumento.agregarPropiedad(new PropiedadTexto(this, "viewBox", "viewBox"));
            propiedadesDocumento.agregarPropiedad(new Propiedad("ancho", "width"));
            propiedadesDocumento.agregarPropiedad(new Propiedad("alto", "height"));
            propiedadesDocumento.agregarPropiedad(new Propiedad("xmlns", "xmlns"));
        }
        return propiedadesDocumento;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        Documento clon = (Documento) super.clone();
        return clon;
    }

    @Override
    public void pintar(Graphics2D graphics, AjustesGraficos ajustes) {
        Rectangle2D rect = getEncuadre();
        if (rect != null) {
            graphics.setColor(Color.WHITE);
            graphics.fill(rect);
            graphics.setColor(Color.BLACK);
            graphics.draw(rect);
        }
        super.pintar(graphics, ajustes);
    }

    @Override
    public String getNombreTag() {
        return "svg";
    }

    public AtrLongitud ancho() {
        return ancho;
    }

    public AtrLongitud alto() {
        return alto;
    }
    
    public AtrString xmlns() {
        return xmlns;
    }
//        
//    public ArtLongitud2 getAncho() {
//        return ancho;
//    }
//
//    public void setAncho(ArtLongitud2 ancho) {
//        this.ancho = ancho;
//    }
//
//    public ArtLongitud2 getAlto() {
//        return alto;
//    }
//
//    public void setAlto(ArtLongitud2 alto) {
//        this.alto = alto;
//    }

    @Override
    public void actualizar() {
        System.out.println("actualizar documento: no hace nada");
//        super.actualizar();
//        simbolos.actualizar();
    }


//    public String getViewBox() {
//        return extension.getX() + " " + extension.getY() + " " + extension.getWidth() + " " + extension.getHeight();
//    }
//
//    public void setViewBox(String viewBox) {
//        
//        String values = viewBox.split("[, \t\r\n]+");
//        this.viewBox = viewBox;
//    }
//    public Rectangle2D getExtension() {
//        return new Rectangle2D.Double(0, 0, ancho, alto);
//    }

//    public void setExtension(Rectangle2D extension) {
//        this.extension = extension;
//    }
    @Override
    public Rectangle2D getEncuadre() {
        if (ancho != null && ancho.getValor() != null && alto != null && alto.getValor() != null) {
            return new Rectangle2D.Double(0.0, 0.0, ancho.getValor(), alto.getValor());
        } else {
            return null;
        }
    }

    public MapaSimbolos getSimbolos() {
        return simbolos;
    }

    public ElementoInstanciaSimbolo convertirEnSimbolo(ConjuntoElementos elementosAAgrupar, String nombre) {
        Simbolo simbolo = new Simbolo();

        for (ElementoSVG elemento : getListaElementos().getLista()) {
            if (elementosAAgrupar.contiene(elemento)) {
                simbolo.agregarElemento(elemento);
            }
        }
        simbolos.agregar(nombre, simbolo);

        ElementoInstanciaSimbolo intancia = new ElementoInstanciaSimbolo(simbolo);
        agregarElemento(intancia);
        borrarElementos(elementosAAgrupar);
        return intancia;
    }

    public void borrarSimbolo(String nombre) {
        simbolos.borrar(nombre);
    }
}
